/**
 * 日期格式化工具函数
 * 解决真机环境和开发者工具环境的时间格式化差异问题
 */

/**
 * 格式化日期时间
 * @param date - 日期字符串、Date对象或时间戳
 * @param format - 格式化模式，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的时间字符串
 */
export function formatDateTime(date: string | Date | number, format: string = 'YYYY-MM-DD HH:mm:ss'): string {
  try {
    let dateObj: Date;
    
    // 处理不同类型的输入
    if (typeof date === 'string') {
      // 处理ISO字符串和其他格式
      dateObj = new Date(date);
    } else if (typeof date === 'number') {
      // 处理时间戳
      dateObj = new Date(date);
    } else if (date instanceof Date) {
      dateObj = date;
    } else {
      throw new Error('Invalid date input');
    }
    
    // 检查日期是否有效
    if (isNaN(dateObj.getTime())) {
      console.error('Invalid date:', date);
      return '无效日期';
    }
    
    // 获取各个时间部分
    const year = dateObj.getFullYear();
    const month = String(dateObj.getMonth() + 1).padStart(2, '0');
    const day = String(dateObj.getDate()).padStart(2, '0');
    const hours = String(dateObj.getHours()).padStart(2, '0');
    const minutes = String(dateObj.getMinutes()).padStart(2, '0');
    const seconds = String(dateObj.getSeconds()).padStart(2, '0');
    
    // 根据格式进行替换
    let result = format;
    result = result.replace('YYYY', String(year));
    result = result.replace('MM', month);
    result = result.replace('DD', day);
    result = result.replace('HH', hours);
    result = result.replace('mm', minutes);
    result = result.replace('ss', seconds);
    
    return result;
  } catch (error) {
    console.error('日期格式化失败:', error, '原始日期:', date);
    return '格式化失败';
  }
}

/**
 * 格式化为本地化时间字符串（兼容真机环境）
 * @param date - 日期字符串、Date对象或时间戳
 * @returns 本地化时间字符串
 */
export function formatLocalDateTime(date: string | Date | number): string {
  return formatDateTime(date, 'YYYY-MM-DD HH:mm:ss');
}

/**
 * 格式化为简短的时间字符串
 * @param date - 日期字符串、Date对象或时间戳
 * @returns 简短时间字符串，如 "12-25 15:30"
 */
export function formatShortDateTime(date: string | Date | number): string {
  return formatDateTime(date, 'MM-DD HH:mm');
}

/**
 * 格式化为相对时间（如：刚刚、5分钟前、1小时前等）
 * @param date - 日期字符串、Date对象或时间戳
 * @returns 相对时间字符串
 */
export function formatRelativeTime(date: string | Date | number): string {
  try {
    const dateObj = new Date(date);
    const now = new Date();
    const diffMs = now.getTime() - dateObj.getTime();
    
    if (diffMs < 0) {
      return formatLocalDateTime(date);
    }
    
    const diffSeconds = Math.floor(diffMs / 1000);
    const diffMinutes = Math.floor(diffSeconds / 60);
    const diffHours = Math.floor(diffMinutes / 60);
    const diffDays = Math.floor(diffHours / 24);
    
    if (diffSeconds < 60) {
      return '刚刚';
    } else if (diffMinutes < 60) {
      return `${diffMinutes}分钟前`;
    } else if (diffHours < 24) {
      return `${diffHours}小时前`;
    } else if (diffDays < 7) {
      return `${diffDays}天前`;
    } else {
      return formatDateTime(date, 'MM-DD HH:mm');
    }
  } catch (error) {
    console.error('相对时间格式化失败:', error);
    return formatLocalDateTime(date);
  }
}

/**
 * 检查日期是否有效
 * @param date - 日期字符串、Date对象或时间戳
 * @returns 是否为有效日期
 */
export function isValidDate(date: string | Date | number): boolean {
  try {
    const dateObj = new Date(date);
    return !isNaN(dateObj.getTime());
  } catch {
    return false;
  }
}

/**
 * 获取友好的时间显示格式
 * 根据时间距离现在的长短，自动选择合适的显示格式
 * @param date - 日期字符串、Date对象或时间戳
 * @returns 友好的时间字符串
 */
export function formatFriendlyTime(date: string | Date | number): string {
  try {
    const dateObj = new Date(date);
    const now = new Date();
    const diffMs = now.getTime() - dateObj.getTime();
    const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
    
    if (diffDays === 0) {
      // 今天：显示时间
      return formatDateTime(date, 'HH:mm');
    } else if (diffDays === 1) {
      // 昨天：显示"昨天 HH:mm"
      return `昨天 ${formatDateTime(date, 'HH:mm')}`;
    } else if (diffDays < 7) {
      // 一周内：显示"X天前"
      return `${diffDays}天前`;
    } else if (dateObj.getFullYear() === now.getFullYear()) {
      // 今年：显示"MM-DD HH:mm"
      return formatDateTime(date, 'MM-DD HH:mm');
    } else {
      // 其他年份：显示完整日期
      return formatDateTime(date, 'YYYY-MM-DD HH:mm');
    }
  } catch (error) {
    console.error('友好时间格式化失败:', error);
    return formatLocalDateTime(date);
  }
}
